"""主程序入口"""
import os
import csv
import json
import time
import random
import argparse
from typing import Optional, Dict
from argparse import RawDescriptionHelpFormatter 

from ytcc.config import load_config, save_config, print_api_key_setup_instructions
from ytcc.api_client import parse_proxy_url, fetch_comment_page
from ytcc.data_processor import format_comment, get_csv_fieldnames
from ytcc.utils import get_api_key_from_env, check_file_overwrite


def main():
    """主函数"""
    try:
        # 加载保存的配置
        saved_config = load_config()
        
        # 解析命令行参数
        parser = argparse.ArgumentParser(
            description="YouTube视频评论收集器",
            epilog="示例：\n"
                   "  首次使用（保存配置）：\n"
                   "    ytcc YouTube视频ID --api-key 你的API密钥 --proxy 你的代理地址\n"
                   "  后续使用（自动读取配置）：\n"
                   "    ytcc YouTube视频ID\n"
                   "  指定输出文件名：\n"
                   "    ytcc YouTube视频ID -o 自定义名称",
                   formatter_class=RawDescriptionHelpFormatter
        )

        parser.add_argument("video_id", help="目标YouTube视频ID（从URL的v=参数获取）")
        parser.add_argument("--api-key", help=f"YouTube Data API密钥，优先于环境变量", default=None)
        parser.add_argument("--proxy", help="完整代理地址（例如：http://host:port 或 http://user:pass@host:port）", default=None)
        parser.add_argument("-o", "--output", help="输出文件前缀（默认：使用视频ID）", default=None)

        args = parser.parse_args()
        target_video_id = args.video_id.strip()
        output_prefix = args.output.strip() if args.output and args.output.strip() else target_video_id

        # 确定API密钥（优先级：命令行参数 > 保存的配置 > 环境变量）
        cli_api_key = args.api_key.strip() if (args.api_key and args.api_key.strip()) else None
        config_api_key = saved_config.get("api_key")
        env_api_key = get_api_key_from_env()
        
        api_key = cli_api_key or config_api_key or env_api_key
        
        if not api_key:
            print_api_key_setup_instructions()
            return

        # 确定代理（优先级：命令行参数 > 保存的配置）
        cli_proxy = args.proxy.strip() if (args.proxy and args.proxy.strip()) else None
        config_proxy = saved_config.get("proxy")
        current_proxy = cli_proxy or config_proxy

        # 检查是否需要保存新配置
        new_config_available = False
        if cli_api_key and cli_api_key != config_api_key:
            new_config_available = True
        if cli_proxy and cli_proxy != config_proxy:
            new_config_available = True

        # 如果有新配置，询问用户是否保存
        if new_config_available:
            while True:
                choice = input("检测到新的API密钥或代理配置，是否保存到配置文件？(y/n): ").strip().lower()
                if choice in ('y', 'yes'):
                    save_config(cli_api_key or config_api_key, cli_proxy or config_proxy)
                    break
                elif choice in ('n', 'no'):
                    print("INFO | 未保存配置，下次运行需要重新输入API密钥和代理")
                    break
                else:
                    print("警告：请输入 y 或 n")

        # 解析代理配置
        proxy_config: Optional[Dict[str, str]] = None
        if current_proxy:
            proxy_config = parse_proxy_url(current_proxy)

        # 准备输出文件
        jsonl_path = f"{output_prefix}.jsonl"
        csv_path = f"{output_prefix}.csv"

        if not check_file_overwrite(jsonl_path) or not check_file_overwrite(csv_path):
            print("INFO | 用户取消操作，程序退出")
            return

        # 收集评论
        total_comments = 0
        current_page_token: Optional[str] = None
        csv_fieldnames = get_csv_fieldnames()

        print(f"INFO | 开始收集视频 [{target_video_id}] 的评论...")

        with open(jsonl_path, "w", encoding="utf-8") as jsonl_file, \
             open(csv_path, "w", encoding="utf-8", newline="") as csv_file:

            csv_writer = csv.DictWriter(csv_file, fieldnames=csv_fieldnames)
            csv_writer.writeheader()

            page_num = 1
            while True:
                print(f"INFO | 获取第 {page_num} 页评论...")
                page_data = fetch_comment_page(current_page_token, proxy_config, target_video_id, api_key)
                comment_list = page_data.get("items", [])

                for raw_comment in comment_list:
                    formatted = format_comment(raw_comment)
                    jsonl_file.write(json.dumps(formatted, ensure_ascii=False) + "\n")
                    csv_writer.writerow(formatted)
                    total_comments += 1

                current_page_token = page_data.get("nextPageToken")
                if not current_page_token:
                    print("INFO | 已获取所有评论（无下一页）")
                    break

                page_num += 1
                time.sleep(random.uniform(0.8, 1.5))

        print(f"INFO | 评论收集完成！共获取 {total_comments} 条评论")
        print(f"INFO | JSONL文件: {os.path.abspath(jsonl_path)}")
        print(f"INFO | CSV文件: {os.path.abspath(csv_path)}")

    except Exception as e:
        print(f"ERROR | 程序运行出错: {str(e)}")
        exit(1)


if __name__ == "__main__":
    main()
    